/* eslint-disable @typescript-eslint/no-explicit-any */
import { loadSession } from 'src/lib/session';

export type Session = Awaited<ReturnType<typeof loadSession>>;

// 校验用户是否已登录
export async function requireAuth() {
  const session = await loadSession();
  if (session.isLoggedIn) {
    return session;
  }
  throw new Error('未授权：需要登录');
}

// 校验用户是否为管理员
export async function requireAdmin() {
  const session = await loadSession();
  if (session.isLoggedIn && session.role === 'admin') {
    return session;
  }
  throw new Error('未授权：需要管理员权限');
}

/**
 * 创建受保护的 action 高阶函数
 * @param action - 需要执行的操作
 */
export function withAuth<T, A extends any[]>(action: (session: Session, ...args: A) => Promise<T>) {
  return async (...args: A): Promise<T> => {
    const session = await requireAuth();
    return action(session, ...args);
  };
}

/**
 * 创建需要管理员权限的 action 高阶函数
 * @param action - 需要执行的操作
 */
export function withAdminAuth<T, A extends any[]>(
  action: (session: Session, ...args: A) => Promise<T>
) {
  return async (...args: A): Promise<T> => {
    const session = await requireAdmin();
    return action(session, ...args);
  };
}
